package com.cskaoyan._08hidden._01basic;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/9 16:16
 **/
/*
研究对象名.成员变量的访问机制

两个方向
1. 访问范围(编译角度,通过对象名.的范围)，究竟能够访问到哪些成员变量？根据什么来决定？
2. 访问结果(运行结果的角度)，如果是父子类同名成员变量，那么结果是什么？根据什么来决定？

三种创建对象的方式:
1.父类引用指向了父类对象(Father father = new Father())

2.子类引用指向子了类对象(Son son  = new Son())

3.父类的引用指向了子类对象(Father fs = new Son())


测试结果
    父类引用指向了父类对象
        访问范围---->父
        访问结果---->父

    子类引用指向子了类对象
        访问的范围----> 父+子
        访问结果------> 子

    父类的引用指向了子类对象
        访问的范围----> 父
        访问的结果----> 父
    结论:
        对于访问范围------> 取决于引用的类型 (编译看左边)
        对于访问结果------> 取决于引用的类型 (运行也看左边)

 */
public class Demo {
    public static void main(String[] args) {
        // 父类引用指向父类的对象
        Father father = new Father();
        System.out.println(father.a);
        //System.out.println(father.b);

        System.out.println("-----------");
        // 子类引用指向子类对象
        Son son = new Son();
        System.out.println(son.a);
        //System.out.println(son.b);
        //System.out.println(son.c);

        System.out.println("------");
        Father fs = new Son();
        System.out.println(fs.a);
        // System.out.println(fs.b);
        // ((Son) fs).c
    }
}

class Father{
    // 定义同名的成员变量
    int a = 1;
    int b = 2;
}


class Son extends Father {
    // 定义同名成员变量
    int a = 10;
    int c = 20;
}